/*
 *  Copyright (C) 2010 glauco
 * 
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 * 
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.balisunrise.common;

import java.beans.PropertyChangeListener;
import java.io.Serializable;

/**
 * Tipo Basico para todos os tipos de Objetos da Visual Entity API.
 * 
 * @author glauco
 */
public interface Basic extends Serializable{

    /**
     * Retorna o nome da Visualizable.
     * Cada Visualizable deve possuir um nome específico para si, diferente
     * dos outros Visualizable.
     * O Nome não deve ser nulo.
     */
    public String getName();

    /**
     * Retorna a Basic proprietária (pai) desta.
     */
    public Basic getOwner();

    /**
     * Atribui a Basic proprietária (pai) desta.
     * @param owner the Basic.
     */
    public void setOwner(Basic owner);

    /**
     * Children são os Basics em que este Basic é proprietário.<br>
     * @return Os Basic filhos deste.
     */
    public Children getChildren();

    /**
     * Atribui o Modo de transação.
     * Dependendo do modo pode existir diferentes formas de exibição e
     * diferentes regras.
     * @param mode Modo referente a interface
     * {@link org.balisunrise.common.Mode}.
     *
     * @see org.balisunrise.common.Mode
     */
    public void setMode(int mode);

    /**
     * A ActionCollection mantém as instâncias dos mapas de ação de uma
     * entidade.<br>
     * As ações do um Basic pegam a ActionCollection do Basic para pegar a
     * instância do mapa de ação referênte a ação.<br>
     * Para que exista apenas uma instância do mapa de ações, o Basic sempre
     * requer a seu proprietário a ActionCollection.<br>
     * Apenas a VisualEntity do topo da arvore ter uma instância de
     * ActionCollection.
     *
     * @return A instância do Basic do topo da árvore de proprietários.
     */
    public ActionCollection getActionCollection();

    /**
     * Cada Basic que dispara um evento deve avisar o seu proprietário (owner)
     * do evento disparado.
     * @param evt Evento disparado.
     */
    public void actionPerformed(Event evt);

    /**
     * Adiciona um PropertyChangeListener.
     * @param listener
     */
    public void addPropertyChangeListener(PropertyChangeListener listener);

    /**
     * Remove um PropertyChageListener.
     * @param listener
     */
    public void removePropertyChangeListener(PropertyChangeListener listener);
}
